学习之前的困难

主要困难就是不知道该怎么修改样式,因为我看到的官网组件样式都是下面这样,黑白两色,我感觉自己不能直接使用,但是又不知道该怎么修改样式,于是就卡住了。这和我之前使用的ant-design和elementUI都有很大的区别。

image-20251022133855695

区别到底在哪里呢?仔细想一想,区别就在与颜色不是我所熟悉的,也就是说我不能像在elementUI里面一样,直接复制粘贴代码,就达到我的需求。而是需要我来配置。从官网可以看到,shadcn的默认主题就是黑白色。https://ui.shadcn.com/themes

image-20251022140357293

这个配置就难倒我了,react里面我还没有写过项目呢,真的不知道该在哪里配置整个项目的样式。那么学习了这个课程之后,我就知道了,主题颜色值是在app/globals.css里面进行配置的,而大小、字体颜色等等可以直接在组件里面配置。至于布局,可以直接使用tailwind写在组件的className里面。可能还有更多配置方式,我还有继续发掘。

组件和globals里面的样式还可以添加,这样自主性就相当大了,而我之前真的是没有经历过这种写法,我都是直接使用开箱即用的库,看来自主性高了,对我的挑战非常大啊。

Introduction & Setup

shadcn可以用在react项目里面,可以自定义组件,非常方便。

创建一个项目npx create-next-app lesson1,像Codevolution里面创建即可。然后安装shadcn,npx shadcn@latest init,选择Slate作为基础颜色,这个后面可以改,然后安装成功。

安装之后,会由两个新文件,并且app/global.css文件会被更改。

image-20251022095520302

新文件lib/utils.ts,这个文件里面有一个辅助函数cn,这个函数的作用是shadcn将tailwind的样式类添加到shadcn组件中。

新文件components.json,这个文件是shadcn的配置文件。

修改了app/global.css,添加了shadcn的样式变量,用来设置shadcn的组件样式。

app/global.css里面添加一些样式:

然后把page.tsx和layout.tsx的内容改一下:

image-20251022100236342

image-20251022100248413

npm run dev启动项目,效果:

image-20251022100419035

Card components

从老师的代码里面拿到_data/db.json文件,放到项目最顶层里面。

image-20251022101306044

另外开一个terminal,安装json-server,npm i -g json-server,然后运行起来json-server --watch ./_data/db.json --port 4000

image-20251022101519184

这样就创建了restful api接口了,接口像这样请求:

image-20251022102736134

然后编写app/page.tsx文件,在这里使用shadcn的Card组件来展示:

注意recipes.map里面就是要写的内容。

文档:https://ui.shadcn.com/docs/components/card

新开一个terminal,npx shadcn@latest add card,安装Card组件,安装完成之后,会发现这个组件自动放到app/components/ui文件夹里面去了,非常贴心。

image-20251022102456118

按照文档的案例,导入Card。

image-20251022103003948

然后copy案例的组件代码:

image-20251022103131295

将实际数据加进去:

效果:

image-20251022105012307

下面就是重点了,shadcn之所以很多人推荐使用,除了引入的是单个组件而不是整个组件库之外,另一个重要原因就是更改shadcn组件的样式非常方便,只需要在组件上使用tailwind来修改即可,不需要担心样式的权重,不需要使用:deep来加强权重,这就省了很多事情了。

效果:

image-20251022105454916

实际上效果不是很好,content的顶部没有对齐,底部左右的文字也没有对齐,这些先不用管。

Badges, Buttons & Avatars

这节课学习badge、button、avatar组件。先安装npx shadcn@latest add button badge avatar。现在来看一个重点,在button.tsx是文件中,有一个buttonVariants的变量,里面有一些属性可以供我们设置button不同的样式。这里默认的是shadcn提供的样式,我们可以在组件里面添加样式,这样风格就可以很简单的统一了。

比如说在variants.variant里面添加third: "bg-red ......",那么我就可以这样使用了<Button variant="third"></Button>。甚至在variants里面也可以直接添加属性对象,比如说textSize : {default: "font-24"},要记住可以这样使用。

image-20251022110513707

像这样使用:

image-20251022110633169

可以供有限的设置样式吧。

引入:

从老师的代码中,复制粘贴public/img文件夹。编写组件:

效果:

image-20251022112713392

Skeleton Components

怎么理解Skeleton这种组件呢?其实就是一种loading的效果,只不过把样式结构更加具体的显示出来了。那么在nextjs里面,怎么显示loading效果呢?希望我能够记起来,就是创建一个loading.tsx文件即可。

那么就是在loading.tsx里面,使用shadcn的Skeleton组件。为了能够复用Skeleton,所以创建一个单独的组件components/SkeletonCard.tsx,就是模仿真实Card的样式。安装npx shadcn@latest add skeleton

然后在loading.tsx中使用它:

在app/page.tsx里面获取数据时,添加延时。查看效果:

Color Themes

shadcn使用oklch颜色值,可以在app/global.css里面看到shadcn定义的一些样式值。

image-20251022120845706

如果要全局的改样式,那么就在这里更改。shadcn也提供了一些样式值供参考:https://ui.shadcn.com/themes,选择需要的主题颜色,点击copy code,将代码粘贴到项目中。

image-20251022121017940

image-20251022121054108

我选一个Yellow色,替换项目中的globals.css的shadcn相关内容,看一下效果:

image-20251022140613254

有了颜色,我就感觉生动太多了。